package com.datang.litejvm.cmd;


import com.datang.litejvm.constant.ConstantPool;
import com.datang.litejvm.engin.ExecutionResult;
import com.datang.litejvm.engin.Heap;
import com.datang.litejvm.engin.JavaObject;
import com.datang.litejvm.engin.StackFrame;

public class IncrementCmd extends TwoOperandCmd {

    public IncrementCmd(ConstantPool pool, String opCode) {
        super(pool, opCode);
    }

    @Override
    public String toString() {
        return super.toString();
    }

    /**
     * @author: 顶风少年
     * @Description: 局部变量自增
     * index 是一个代表当前栈帧（§2.6）中局部变量表的索引的无符号 byte 类
     * 型整数，const 是一个有符号的 byte 类型数值。由 index 定位到的局部变
     * 量必须是 int 类型，const 首先带符号扩展成一个 int 类型数值，然后加到
     * 由 index 定位到的局部变量中。
     * @date: 16:45 2022/6/20
     **/
    @Override
    public void execute(StackFrame frame, ExecutionResult result) {
        int index = this.getOprand1();
        int constValue = this.getOprand2();
        int currentValue = frame.getLocalVariableValue(index).getIntValue();
        JavaObject javaObject = Heap.getInstance().newInt(constValue + currentValue);
        frame.setLocalVariableValue(index, javaObject);
    }
}